package test;

/**
 * @Author fallrain
 * @Description java单例模式——详解JAVA单例模式及8种实现方式  https://blog.csdn.net/qq_41458550/article/details/109243456
 * @Date 2022/2/11 15:24
 * @Version 1.0
 */
public class Singleton {

   private static final Singleton singleton01 = new Singleton();

   private Singleton(){}

    /**
     * 饿汉式 静态常量 可用
     * @return
     */
   public static Singleton getSingleton01(){
       return  singleton01;
   }

   private static  Singleton singleton02;

   static {
       singleton02 = new Singleton();
   }

    /**
     * 饿汉式 静态代码块 可用
     * @return
     */
   public static Singleton getSingleton02(){
       return singleton02;
   }

   private static Singleton singleton03;

    /**
     * 懒汉式 线程不安全 不可用
     * @return
     */
   public static Singleton getSingleton03(){

       if(singleton03 == null){
           singleton03 = new Singleton();
       }
       return singleton03;
   }

    /**
     * 懒汉式 线程安全 同步方法 不推荐用
     * @return
     */
   public static synchronized Singleton getInstance04(){

       if(singleton03 == null){
           singleton03 = new Singleton();
       }
       return singleton03;
   }

    /**
     * 懒汉式 线程安全 同步代码块 不可用
     * @return
     */
   public static Singleton getInstance05(){
       if(singleton03 == null){
           synchronized (Singleton.class){
               singleton03 = new Singleton();
           }
       }
       return  singleton03;
   }

    /**
     * 懒汉式 双重检查 推荐使用
     * @return
     */
   public static Singleton getInstance06(){
       if (singleton03 == null){
           synchronized (Singleton.class){
               if(singleton03 == null){
                   singleton03 = new Singleton();
               }
           }
       }
       return singleton03;
   }

   private static class SingletonInstance {
       private static final Singleton INSTANCE = new Singleton();
   }

    /**
     * 静态内部类 推荐使用
     * @return
     */
   public static Singleton getInstance07(){
       return SingletonInstance.INSTANCE;
   }
    /**
     * 所谓双亲委派，则是先让父类加载器试图先加载此Class,只有父类加载器无法加载改Class时才尝试从自己的类路径中加载该类。
     */




}
